﻿// 自己的理解：分为两块 
// webhost的构建
// httpcontext的处理

/// <summary>
/// 管道的理解： Pipeline = Server + 多个Middlewares  =>  Pipeline =Server + HttpHandler
/// </summary>

/// <summary>
/// 将ASP.NET Core最本质、最核心的部分提取出来，重新构建了一个迷你版的ASP.NET Core框架。
/// </summary>
public class Program
{
    /// <summary>
    /// 在创建出WebHostBuilder之后，我们调用了它的扩展方法UseHttpListener注册了一个自定义的基于HttpListener的服务器。在随后针对Configure方法的调用中，我们注册了三个中间件。
    /// 由于中间件最终是通过Delegate对象来体现的，所以我们可以将中间件定义成与Delegate类型具有相同签名的方法。
    /// </summary>
    public static async Task Main()
    {
        //await new WebHostBuilder()
        //    .UseHttpListener()
        //    .Configure(app => app
        //        .Use(FooMiddleware)
        //        .Use(BarMiddleware)
        //        .Use(BazMiddleware))
        //    .Build()
        //    .StartAsync();

        // 创建webHostBuilder
        IWebHostBuilder webHostBuilder = new WebHostBuilder();
        // 创建IServer
        webHostBuilder = webHostBuilder.UseHttpListener();
        webHostBuilder = webHostBuilder.Configure(app =>
        {
            app = app.Use(FooMiddleware);
            app = app.Use(BarMiddleware);
            app.Use(BazMiddleware);
        });
        IWebHost? webHost = webHostBuilder.Build();
        await webHost.StartAsync();
    }

    /// <summary>
    /// 响应的内容中写入一段文字
    /// </summary>    
    public static RequestDelegate FooMiddleware(RequestDelegate next)
    => async context =>
    {
        await context.Response.WriteAsync("Foo=>");
        await next(context);
    };


    public static RequestDelegate BarMiddleware(RequestDelegate next)
    => async context =>
    {
        await context.Response.WriteAsync("Bar=>");
        await next(context);
    };

    public static RequestDelegate BazMiddleware(RequestDelegate next)
    => context => context.Response.WriteAsync("Baz");
}

/// <summary>
/// 中间件最终是通过Delegate对象来体现的，所以我们可以将中间件定义成与Delegate类型具有相同签名的方法
/// 针对HTTP请求既可以是同步的，也可以是异步的，更多地其实是异步
/// </summary>
public delegate Task RequestDelegate(HttpContext context);